package br.com.smachado.calcados.repository;

import br.com.smachado.calcados.entity.AppEntity;
import java.util.Collection;
import java.util.logging.Logger;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

/**
 * Classe com metodos genericos de persistencia
 * 
 * @author gu
 * @since 1.0-SNAPSHOT
 */
public class AppRepository {
    
    protected static final Logger log = Logger.getLogger(AppRepository.class.getName());
    
    private static final String PERSISTENCE_UNIT_NAME = "calcadosPU";
    private EntityManagerFactory factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
    
    /**
     * Inclusao de entidades da aplicacao
     * @param entidade
     */
    public void incluir(AppEntity entidade){
        
        EntityManager em = getFactory().createEntityManager();
        
        try{
            
            em.getTransaction().begin();
            em.persist(entidade);
            em.getTransaction().commit();
            
        }catch(Exception e){
            em.getTransaction().rollback();
            log.info(e.getMessage());
        }finally{
            em.close();
        }
                
    }
    
    /**
     * Alteracao de entidades da aplicacao
     * @param entidade
     */
    public void alterar(AppEntity entidade){
        
        EntityManager em = getFactory().createEntityManager();
        
        try{
            
            em.getTransaction().begin();
            em.merge(entidade);
            em.getTransaction().commit();
            
        }catch(Exception e){
            em.getTransaction().rollback();
            log.info(e.getMessage());
        }finally{
            em.close();
        }
                
    }
    
    /**
     * Recupera uma entidade pelo id
     * @param classe
     * @param id
     * @return entidade recuperada
     */
    public AppEntity recuperarPorId(Class<? extends AppEntity> classe, Object id){
        
        EntityManager em = getFactory().createEntityManager();
        
        try{
            
            em.getTransaction().begin();
            return em.find(classe, id);
            
        }catch(Exception e){
            em.getTransaction().rollback();
            log.info(e.getMessage());
        }finally{
            em.close();
        }
        
        return null;
        
    }
    
    /**
     * Exclusão de entidades da aplicacao
     * @param entidade
     */
    public void excluir(AppEntity entidade){
        
        EntityManager em = getFactory().createEntityManager();
        
        try{
            
            em.getTransaction().begin();
            em.remove(em.merge(entidade));
            em.getTransaction().commit();
            
        }catch(Exception e){
            em.getTransaction().rollback();
            log.info(e.getMessage());
        }finally{
            em.close();
        }
             
    }
    
    public Collection<AppEntity> listarTodos(Class<? extends AppEntity> classe){
        
        EntityManager em = getFactory().createEntityManager();
        
        try{
            
            em.getTransaction().begin();
            
            return (Collection<AppEntity>) em.createQuery(
                    "select obj from " + classe.getSimpleName() + " obj ")
                    .getResultList();
            
        }catch(Exception e){
            em.getTransaction().rollback();
            log.info(e.getMessage());
        }finally{
            em.close();
        }
        
        return null;
        
    }
    
    public EntityManagerFactory getFactory() {
        return factory;
    }

    public void setFactory(EntityManagerFactory factory) {
        this.factory = factory;
    }
    
}
